package Util;

import android.graphics.Color;
import android.graphics.Matrix;
import android.support.annotation.ColorInt;
import android.support.annotation.ColorRes;
import android.text.SpannableString;

import com.example.lib_base.R;
import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.charts.Chart;
import com.github.mikephil.charting.charts.CombinedChart;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.CombinedData;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.IValueFormatter;
import com.github.mikephil.charting.formatter.PercentFormatter;
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.ViewPortHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by admin on 2018/3/12.
 */

public class MPChartUtils {
    /**
     * 显示无数据的提示
     *
     * @param mChart
     */
    public static void NotShowNoDataText(Chart mChart,int color) {
        mChart.clear();
        mChart.notifyDataSetChanged();
        mChart.setNoDataText("你还没有记录数据");
        mChart.setNoDataTextColor(color);
        mChart.invalidate();
    }
    /**
     *  配置Chart 基础设置
     * @param mChart 图表
     * @param mLabels x 轴标签
     * @param yMax y 轴最大值
     * @param yMin y 轴最小值
     * @param isShowLegend 是否显示图例
     */
    public static void configChart(CombinedChart mChart, List<String> mLabels, float yMax, float yMin, boolean isShowLegend,int labelcolor) {
        /**Chart 的基础设置*/
        // 设置是否绘制背景
        mChart.setDrawGridBackground(false);
        // 设置是否绘制边框
        mChart.setDrawBorders(false);
        // 设置是否可以缩放图表
        mChart.setScaleEnabled(false);
        // 设置是否可以用手指移动图表
        mChart.setDragEnabled(true);
        mChart.setNoDataText("没有数据");
        // 显示描述数据
        mChart.getDescription().setEnabled(true);
        // 设置描述
        mChart.getDescription().setText("月销售额");
        // 设置描述显示的位置，默认是显示在图表的右下角的
        mChart.getDescription().setPosition(200,30);
        mChart.getDescription().setTextColor(labelcolor);
        mChart.getDescription().setTextSize(12.0f);
        //是否显示右侧y轴
        mChart.getAxisRight().setEnabled(false);
        /**图例相关设置*/
        Legend legend = mChart.getLegend();
        // 是否显示图例
        if (isShowLegend) {
            //是否显示
            legend.setEnabled(true);
            // 图例描述文字颜色
            legend.setTextColor(labelcolor);
            //图例样式：有圆点，正方形，短线 几种样式
            legend.setForm(Legend.LegendForm.CIRCLE);
            // 图例显示的位置：如下2行代码设置图例显示在左下角
            legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
            legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
            // 图例的排列方式：水平排列和竖直排列2种
            legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
            //图例距离y轴的距离
            legend.setYEntrySpace(20f);
            //图例的大小
            legend.setFormSize(10f);
            // 图例描述文字大小
            legend.setTextSize(12);
            // 图例距离x轴的距离
            legend.setXEntrySpace(20f);

        } else {
            legend.setEnabled(false);
        }


/**x轴先关设置*/
        XAxis xAxis = mChart.getXAxis();

        // 是否显示x轴线
        xAxis.setDrawAxisLine(true);
        // 设置x轴线的颜色
        xAxis.setAxisLineColor(labelcolor);
        // 是否绘制x方向网格线
        xAxis.setDrawGridLines(false);
        //x方向网格线的颜色
        xAxis.setGridColor(Color.parseColor("#30FFFFFF"));

        // 设置x轴数据的位置
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        // 设置x轴文字的大小
        xAxis.setTextSize(12);

        // 设置x轴数据偏移量
        xAxis.setYOffset(5);
        final List<String> labels = mLabels;
        // 显示x轴标签
        IAxisValueFormatter formatter = new IAxisValueFormatter() {

            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                int index = (int) value;
                if (index < 0 || index >= labels.size()) {
                    return "";
                }
                return labels.get(index);
                // return labels.get(Math.min(Math.max((int) value, 0), labels.size() - 1));
            }

        };
        // 引用标签
        xAxis.setValueFormatter(formatter);
        // 设置x轴文字颜色
        xAxis.setTextColor(labelcolor);
        // 设置x轴每最小刻度 interval
        xAxis.setGranularity(1f);
/**y轴先关设置*/
        YAxis yAxis = mChart.getAxisLeft();
        //设置x轴的最大值
        yAxis.setAxisMaximum(yMax);
        // 设置y轴的最大值
        yAxis.setAxisMinimum(yMin);
        // 是否显示y轴线
        yAxis.setDrawAxisLine(true);
        // 设置y轴线的颜色
        yAxis.setAxisLineColor(labelcolor);
        // 设置y轴数据的位置
        yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        // 不从y轴发出横向直线
        yAxis.setDrawGridLines(false);
        // 是否显示y轴坐标线
        yAxis.setDrawZeroLine(true);
        // 设置y轴的文字颜色
        yAxis.setTextColor(labelcolor);
        // 设置y轴文字的大小
        yAxis.setTextSize(12);
        // 设置y轴数据偏移量
        //yAxis.setXOffset(30);
        // yAxis.setYOffset(-3);
        yAxis.setXOffset(5);
        // yAxis.setGranularity(yGranularity);
        // 设置y轴label 数量
        yAxis.setLabelCount(5, false);
        // 设置y轴的最小刻度
        yAxis.setGranularity(5);//interval

        Matrix matrix = new Matrix();
        // 根据数据量来确定 x轴缩放大倍
        if (mLabels.size() <= 10) {
            matrix.postScale(1.0f, 1.0f);
        } else if (mLabels.size() <= 15) {
            matrix.postScale(1.5f, 1.0f);
        } else if (mLabels.size() <= 20) {
            matrix.postScale(2.0f, 1.0f);
        } else {
            matrix.postScale(3.5f, 1.0f);
        }

        // 在图表动画显示之前进行缩放
        mChart.getViewPortHandler().refresh(matrix, mChart, false);
        // x轴执行动画
        mChart.animateY(1500);

    }

    /**
     * 初始化数据
     *
     * @param chart
     * @param lineDatas
     */
    public static void initData(CombinedChart chart, LineData... lineDatas) {
        CombinedData combinedData = new CombinedData();


        for (LineData lineData : lineDatas) {
            combinedData.setData(lineData);
        }
        chart.setData(combinedData);
        // 设置在曲线图中显示的最大数量
        chart.setVisibleXRangeMaximum(10);
        chart.moveViewToX(combinedData.getEntryCount() - 1);
        chart.invalidate();
    }

    /**
     * 获取LineDataSet
     *
     * @param entries
     * @param label
     * @param textColor
     * @param lineColor
     * @return
     */
    public static LineDataSet getLineData(List<Entry> entries, String label,  int textColor,  int lineColor, boolean isFill) {
        LineDataSet dataSet = new LineDataSet(entries, label);
        // 设置曲线的颜色
        dataSet.setColor(lineColor);
        //数值文字颜色
        dataSet.setValueTextColor(textColor);
        //数值文字大小
        dataSet.setValueTextSize(12);
        // 模式为贝塞尔曲线
        dataSet.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
        // 是否绘制数据值
        dataSet.setDrawValues(true);
        // 是否绘制圆点
        dataSet.setDrawCircles(true);
        // 是否绘制圆点孔
        dataSet.setDrawCircleHole(false);
//        // 这里有一个坑，当我们想隐藏掉高亮线的时候，MarkerView 跟着不见了
//        // 因此只有将它设置成透明色
//        dataSet.setHighlightEnabled(true);// 隐藏点击时候的高亮线
        //设置高亮线为透明色
        dataSet.setHighLightColor(Color.TRANSPARENT);

        if (isFill) {
            //是否设置填充曲线到x轴之间的区域
            dataSet.setDrawFilled(true);
            // 填充颜色
            dataSet.setFillColor(lineColor);
        }
        //设置圆点的颜色
        dataSet.setCircleColor(lineColor);
        // 设置圆点半径
        dataSet.setCircleRadius(3.5f);
        // 设置线的宽度
        dataSet.setLineWidth(1f);
        return dataSet;
    }
/**
 *
 * // 1.配置基础图表配置
 MPChartUtils.configChart(mWeightChart, xLabels, maxWeight, minWeight, true);
 // 2,获取数据Data，这里有2条曲线
 LineDataSet tartgetDataSet = MPChartUtils.getLineData(targetEntries, "目标体重", Color.WHITE, Color.WHITE, false);
 LineDataSet lineDataSet = MPChartUtils.getLineData(weightEntries, "当前体重", Color.WHITE, getResources().getColor(R.color.chart_dot_color), false);
 //  3,初始化数据并绘制
 MPChartUtils.initData(mWeightChart, new LineData(lineDataSet, tartgetDataSet));
 * */
/**=============================================================================================================================*/
    /**
     * 获取barDataSet
     * @param entries
     * @param label
     * @param textColor
     * @param lineColor
     * @return
     */
    public static BarDataSet getBarDataSet(List<BarEntry> entries, String label, @ColorInt int textColor, @ColorInt int lineColor) {
        BarDataSet dataSet = new BarDataSet(entries, label);
        //宽度
        dataSet.setBarBorderWidth(5);
        //设置阴影颜色
        dataSet.setBarShadowColor(lineColor);
        //数值文字颜色
        dataSet.setValueTextColor(textColor);
        // 是否绘制数据值
        dataSet.setDrawValues(false);
        return dataSet;
    }

    /**
     * 配置柱状图基础设置
     * @param barChart
     * @param xLabels
     */
    public static void configBarChart(BarChart barChart, final List<String> xLabels) {
        barChart.getDescription().setEnabled(false);//设置描述
        barChart.setPinchZoom(false);//设置按比例放缩柱状图
        barChart.setScaleEnabled(false);
        barChart.setDragEnabled(true);
        barChart.setNoDataText(""); // 没有数据时的提示文案
        //x坐标轴设置
        // IAxisValueFormatter xAxisFormatter = new StringAxisValueFormatter(xAxisValue);//设置自定义的x轴值格式化器
        XAxis xAxis = barChart.getXAxis();//获取x轴
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置X轴标签显示位置
        xAxis.setDrawGridLines(false);//不绘制格网线
        xAxis.setGranularity(1f);//设置最小间隔，防止当放大时，出现重复标签。
        // 显示x轴标签
        IAxisValueFormatter formatter = new IAxisValueFormatter() {

            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return xLabels.get(Math.min(Math.max((int) value, 0), xLabels.size() - 1));
            }

        };
        xAxis.setValueFormatter(formatter);
        xAxis.setTextSize(10);//设置标签字体大小
        xAxis.setTextColor(barChart.getResources().getColor(R.color.black));
        xAxis.setAxisLineColor(Color.parseColor("#4cffffff"));
        xAxis.setLabelCount(xLabels.size());//设置标签显示的个数

        //y轴设置
        YAxis leftAxis = barChart.getAxisLeft();//获取左侧y轴
        leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);//设置y轴标签显示在外侧
        leftAxis.setAxisMinimum(0f);//设置Y轴最小值
        leftAxis.setDrawGridLines(false);
        leftAxis.setDrawLabels(true);//禁止绘制y轴标签
        leftAxis.setDrawAxisLine(false);//禁止绘制y轴
        leftAxis.setAxisLineColor(Color.parseColor("#4cffffff"));
        leftAxis.setTextColor(barChart.getResources().getColor(R.color.black));
        leftAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return ((int) (value * 100)) + "%";
            }
        });

        barChart.getAxisRight().setEnabled(false);//禁用右侧y轴
        barChart.getLegend().setEnabled(false);
        //图例设置
       /* Legend legend = barChart.getLegend();
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);//图例水平居中
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);//图例在图表上方
        legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);//图例的方向为水平
        legend.setDrawInside(false);//绘制在chart的外侧
        legend.setDirection(Legend.LegendDirection.LEFT_TO_RIGHT);//图例中的文字方向

        legend.setForm(Legend.LegendForm.SQUARE);//图例窗体的形状
        legend.setFormSize(0f);//图例窗体的大小
        legend.setTextSize(16f);//图例文字的大小*/
        //legend.setYOffset(-2f);


        Matrix matrix = new Matrix();
        // 根据数据量来确定 x轴缩放大倍
        if (xLabels.size() <= 10) {
            matrix.postScale(1.0f, 1.0f);
        } else if (xLabels.size() <= 15) {
            matrix.postScale(1.5f, 1.0f);
        } else if (xLabels.size() <= 20) {
            matrix.postScale(2.0f, 1.0f);
        } else {
            matrix.postScale(3.0f, 1.0f);
        }
        barChart.getViewPortHandler().refresh(matrix, barChart, false);
        barChart.setExtraBottomOffset(10);//距视图窗口底部的偏移，类似与paddingbottom
        barChart.setExtraTopOffset(30);//距视图窗口顶部的偏移，类似与paddingtop
        barChart.setFitBars(true);//使两侧的柱图完全显示
        barChart.animateY(1500);//数据显示动画，从左往右依次显示
    }

    /**
     * 初始化柱状图图表数据
     * @param chart
     * @param entries
     * @param title
     * @param barColor
     */
    public static void initBarChart(BarChart chart, List<BarEntry> entries, String title, @ColorInt int barColor) {
        BarDataSet set1 = new BarDataSet(entries, title);
        set1.setValueTextColor(Color.WHITE);
        set1.setColor(barColor);
        ArrayList<IBarDataSet> dataSets = new ArrayList<>();
        dataSets.add(set1);

        BarData data = new BarData(dataSets);
        data.setValueTextSize(10f);
        // 设置bar的宽度，但是点很多少的时候好像没作用，会拉得很宽
        data.setBarWidth(0.1f);
        // 设置value值 颜色
        data.setValueTextColor(Color.WHITE);
        //设置y轴显示的标签
        data.setValueFormatter(new IValueFormatter() {
            @Override
            public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
                return ((int) (value * 100)) + "%";
            }
        });


        chart.setData(data);
        chart.invalidate();
    }
/**=======================================================================================================================*/
    public static void configPieCHart(int labelcolor,int cententcolor,PieChart mPieChart,ArrayList<PieEntry> entries){
        //使用百分值
        mPieChart.setUsePercentValues(true);
        //设置描述
        mPieChart.getDescription().setEnabled(true);
        // 描述文字
        mPieChart.getDescription().setText("90天");
        mPieChart.getDescription().setTextSize(20f);
        mPieChart.getDescription().setTextColor(labelcolor);
        mPieChart.setExtraOffsets(5, 10, 5, 5);
        //减速摩擦阻力系数
        mPieChart.setDragDecelerationFrictionCoef(0.95f);
        //设置中间文字
        mPieChart.setCenterText(generateCenterSpannableText());
        mPieChart.setCenterTextSize(15);
        mPieChart.setCenterTextColor(cententcolor);
        //设置孔
        mPieChart.setDrawHoleEnabled(true);
        //中间孔颜色
        mPieChart.setHoleColor(Color.TRANSPARENT);
        //孔半径
        mPieChart.setHoleRadius(52f);
        //圆环半径
        mPieChart.setTransparentCircleRadius(56f);
        mPieChart.setTransparentCircleColor(Color.WHITE);
        mPieChart.setTransparentCircleAlpha(80);
        //中间文字是否显示
        mPieChart.setDrawCenterText(true);
        //旋转角度
        mPieChart.setRotationAngle(0);
        // 触摸旋转
        mPieChart.setRotationEnabled(false);
        //高亮
        mPieChart.setHighlightPerTapEnabled(true);
        //变化监听
      //  mPieChart.setOnChartValueSelectedListener(this);
        //模拟数据
//        ArrayList<PieEntry> entries = new ArrayList<PieEntry>();
//        entries.add(new PieEntry(40, "优秀"));
//        entries.add(new PieEntry(20, "满分"));
//        entries.add(new PieEntry(30, "及格"));
//        entries.add(new PieEntry(10, "不及格"));

        //设置数据
        setData(labelcolor,mPieChart,entries);

        mPieChart.animateY(1000, Easing.EasingOption.EaseInOutQuad);
        //设置图例
        Legend mLegend= mPieChart.getLegend();

        mLegend.setPosition(Legend.LegendPosition.BELOW_CHART_LEFT);  //左下边显示
        mLegend.setFormSize(12f);//比例块字体大小
        mLegend.setXEntrySpace(2f);//设置距离饼图的距离，防止与饼图重合
        mLegend.setYEntrySpace(2f);
        //设置比例块换行...
        mLegend.setWordWrapEnabled(true);
        mLegend.setDirection(Legend.LegendDirection.LEFT_TO_RIGHT);

        mLegend.setTextColor(labelcolor);
        mLegend.setForm(Legend.LegendForm.SQUARE);//设置比例块形状，默认为方块
        mLegend.setEnabled(false);//设置禁用比例块

        // 输入标签样式
        mPieChart.setEntryLabelColor(Color.BLUE);
        mPieChart.setEntryLabelTextSize(12f);
    }
    //设置中间文字
    private static SpannableString generateCenterSpannableText() {
        //原文：MPAndroidChart\ndeveloped by Philipp Jahoda
        SpannableString s = new SpannableString("90天买家关注重心");
        //s.setSpan(new RelativeSizeSpan(1.7f), 0, 14, 0);
        //s.setSpan(new StyleSpan(Typeface.NORMAL), 14, s.length() - 15, 0);
        // s.setSpan(new ForegroundColorSpan(Color.GRAY), 14, s.length() - 15, 0);
        //s.setSpan(new RelativeSizeSpan(.8f), 14, s.length() - 15, 0);
        // s.setSpan(new StyleSpan(Typeface.ITALIC), s.length() - 14, s.length(), 0);
        // s.setSpan(new ForegroundColorSpan(ColorTemplate.getHoloBlue()), s.length() - 14, s.length(), 0);
        return s;
    }
    //设置数据
    private static void setData(int textcolor,PieChart mPieChart,ArrayList<PieEntry> entries) {
        PieDataSet dataSet = new PieDataSet(entries, "");
        dataSet.setSliceSpace(2f);
        dataSet.setSelectionShift(3f);
        //数据和颜色
        ArrayList<Integer> colors = new ArrayList<Integer>();
        for (int c : ColorTemplate.VORDIPLOM_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.JOYFUL_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.COLORFUL_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.LIBERTY_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.PASTEL_COLORS)
            colors.add(c);
        colors.add(ColorTemplate.getHoloBlue());
        dataSet.setColors(colors);
        //百分比移除去
        dataSet.setValueLinePart1OffsetPercentage(80f);
        dataSet.setValueLinePart1Length(0.3f);
        dataSet.setValueLinePart2Length(0.4f);
        dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);

        PieData data = new PieData(dataSet);
        data.setValueFormatter(new PercentFormatter());
        data.setValueTextSize(12f);
        data.setValueTextColor(textcolor);
        mPieChart.setData(data);
        mPieChart.highlightValues(null);
        //刷新
        mPieChart.invalidate();
    }
    /**
     * //显示百分比
     case R.id.btn_show_percentage:
     for (IDataSet<?> set : mPieChart.getData().getDataSets())
     set.setDrawValues(!set.isDrawValuesEnabled());

     mPieChart.invalidate();
     break;
     //显示类型
     case R.id.btn_show_type:
     if (mPieChart.isDrawHoleEnabled())
     mPieChart.setDrawHoleEnabled(false);
     else
     mPieChart.setDrawHoleEnabled(true);
     mPieChart.invalidate();
     break;
     //x轴动画
     case R.id.btn_anim_x:
     mPieChart.animateX(1400);
     break;
     //y轴动画
     case R.id.btn_anim_y:
     mPieChart.animateY(1400);
     break;
     //xy轴动画
     case R.id.btn_anim_xy:
     mPieChart.animateXY(1400, 1400);
     break;
     //保存到sd卡
     case R.id.btn_save_pic:
     mPieChart.saveToPath("title" + System.currentTimeMillis(), "");
     break;
     //显示中间文字
     case R.id.btn_show_center_text:
     if (mPieChart.isDrawCenterTextEnabled())
     mPieChart.setDrawCenterText(false);
     else
     mPieChart.setDrawCenterText(true);
     mPieChart.invalidate();
     break;
     //旋转动画
     case R.id.btn_anim_rotating:
     mPieChart.spin(1000, mPieChart.getRotationAngle(), mPieChart.getRotationAngle() + 360, Easing.EasingOption
     .EaseInCubic);
     break;

    */
}